Put the code to protect against broken loaders that forget to set error in
authorMatthias Clasen <mclasen@redhat.com>
Mon, 17 Jul 2006 02:37:29 +0000 (02:37 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 17 Jul 2006 02:37:29 +0000 (02:37 +0000)
2006-07-16  Matthias Clasen  <mclasen@redhat.com>

* gdk-pixbuf-loader.c (gdk_pixbuf_loader_load_module)
(gdk_pixbuf_loader_write, gdk_pixbuf_loader_close)
(gdk_pixbuf_loader_ensure_error): Put the code to protect
against broken loaders that forget to set error in an
auxiliary function and call it in more places.  (#346428,
 Catmur)

gdk-pixbuf/ChangeLog
gdk-pixbuf/gdk-pixbuf-loader.c

index a0624ad311517651339489debc2b4d668b9d3138..f6d8bb9c425116bd5e90492f07ab3db6c3105c0d 100644 (file)
@@ -1,5 +1,12 @@
 2006-07-16  Matthias Clasen  <mclasen@redhat.com>
 
+       * gdk-pixbuf-loader.c (gdk_pixbuf_loader_load_module) 
+       (gdk_pixbuf_loader_write, gdk_pixbuf_loader_close) 
+       (gdk_pixbuf_loader_ensure_error): Put the code to protect
+       against broken loaders that forget to set error in an
+       auxiliary function and call it in more places.  (#346428,
+        Catmur)
+
        * io-xbm.c: Fix incremental loading of 
        xbms.  (#346427, Ed Catmur)
        Also make the xbm loader accept const variations.
index 86702c91eec5e4cb396e0114ecf93fd45b78a9b4..b03f06e83edc23073a3cca85d4e94dd434a4628d 100644 (file)
@@ -303,6 +303,27 @@ gdk_pixbuf_loader_update (GdkPixbuf *pixbuf,
                                MIN (height, gdk_pixbuf_animation_get_height (priv->animation)));
 }
 
+/* Defense against broken loaders; DO NOT take this as a GError example! */
+static void
+gdk_pixbuf_loader_ensure_error (GdkPixbufLoader *loader,
+                                GError         **error)
+{ 
+        GdkPixbufLoaderPrivate *priv = loader->priv;
+
+        if (error == NULL || *error != NULL)
+                return;
+
+        g_warning ("Bug! loader '%s' didn't set an error on failure",
+                   priv->image_module->module_name);
+        g_set_error (error,
+                     GDK_PIXBUF_ERROR,
+                     GDK_PIXBUF_ERROR_FAILED,
+                     _("Internal error: Image loader module '%s' failed to"
+                       " complete an operation, but didn't give a reason for"
+                       " the failure"),
+                     priv->image_module->module_name);
+}
+
 static gint
 gdk_pixbuf_loader_load_module (GdkPixbufLoader *loader,
                                const char      *image_type,
@@ -358,23 +379,7 @@ gdk_pixbuf_loader_load_module (GdkPixbufLoader *loader,
   
         if (priv->context == NULL)
                 {
-                        /* Defense against broken loaders; DO NOT take this as a GError
-                         * example
-                         */
-                        if (error && *error == NULL)
-                                {
-                                        g_warning ("Bug! loader '%s' didn't set an error on failure",
-                                                   priv->image_module->module_name);
-                                        g_set_error (error,
-                                                     GDK_PIXBUF_ERROR,
-                                                     GDK_PIXBUF_ERROR_FAILED,
-                                                     _("Internal error: Image loader module '%s'"
-                                                       " failed to begin loading an image, but didn't"
-                                                       " give a reason for the failure"),
-                                                     priv->image_module->module_name);
-
-                                }
-      
+                        gdk_pixbuf_loader_ensure_error (loader, error);
                         return 0;
                 }
   
@@ -450,7 +455,10 @@ gdk_pixbuf_loader_write (GdkPixbufLoader *loader,
       
                         eaten = gdk_pixbuf_loader_eat_header_write (loader, buf, count, error);
                         if (eaten <= 0)
-                                return FALSE;
+                                {
+                                        gdk_pixbuf_loader_ensure_error (loader, error);
+                                        return FALSE;
+                                }
       
                         count -= eaten;
                         buf += eaten;
@@ -461,19 +469,8 @@ gdk_pixbuf_loader_write (GdkPixbufLoader *loader,
                         gboolean retval;
                         retval = priv->image_module->load_increment (priv->context, buf, count,
                                                                      error);
-                        if (!retval && error && *error == NULL)
-                                {
-                                        /* Fix up busted image loader */
-                                        g_warning ("Bug! loader '%s' didn't set an error on failure",
-                                                   priv->image_module->module_name);
-                                        g_set_error (error,
-                                                     GDK_PIXBUF_ERROR,
-                                                     GDK_PIXBUF_ERROR_FAILED,
-                                                     _("Internal error: Image loader module '%s'"
-                                                       " failed to begin loading an image, but didn't"
-                                                       " give a reason for the failure"),
-                                                     priv->image_module->module_name);
-                                }
+                        if (!retval)
+                                gdk_pixbuf_loader_ensure_error (loader, error);
 
                         return retval;
                 }
@@ -716,7 +713,10 @@ gdk_pixbuf_loader_close (GdkPixbufLoader *loader,
         if (priv->image_module && priv->image_module->stop_load && priv->context) 
                 {
                         if (!priv->image_module->stop_load (priv->context, error))
-                                retval = FALSE;
+                                {
+                                        gdk_pixbuf_loader_ensure_error (loader, error);
+                                        retval = FALSE;
+                                }
                 }
   
         priv->closed = TRUE;